From 95dae30a62be4e1e41fa29a393244206a85ec974 Mon Sep 17 00:00:00 2001 From: Tim Deegan Date: Thu, 21 Dec 2006 13:43:19 +0000 Subject: [PATCH] [QEMU] Align VGA ram allocation This makes the SSE-optimized vram_dirty() safe again. Signed-off-by: Tim Deegan --- tools/ioemu/hw/vga.c | 11 ++++++++--- tools/ioemu/hw/vga_int.h | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/tools/ioemu/hw/vga.c b/tools/ioemu/hw/vga.c index 6b9317f048..a8402aa75f 100644 --- a/tools/ioemu/hw/vga.c +++ b/tools/ioemu/hw/vga.c @@ -2002,7 +2002,10 @@ void vga_common_init(VGAState *s, DisplayState *ds, uint8_t *vga_ram_base, s->vram_shadow = (uint8_t *)((long)(s->vram_shadow + TARGET_PAGE_SIZE - 1) & ~(TARGET_PAGE_SIZE - 1)); - s->vram_ptr = qemu_malloc(vga_ram_size); + /* Video RAM must be 128-bit aligned for SSE optimizations later */ + s->vram_alloc = qemu_malloc(vga_ram_size + 15); + s->vram_ptr = (uint8_t *)((long)(s->vram_alloc + 15) & ~15L); + s->vram_offset = vga_ram_offset; s->vram_size = vga_ram_size; s->ds = ds; @@ -2126,7 +2129,7 @@ void *vga_update_vram(VGAState *s, void *vga_ram_base, int vga_ram_size) } if (!vga_ram_base) { - vga_ram_base = qemu_malloc(vga_ram_size); + vga_ram_base = qemu_malloc(vga_ram_size + TARGET_PAGE_SIZE + 1); if (!vga_ram_base) { fprintf(stderr, "reallocate error\n"); return NULL; @@ -2134,8 +2137,10 @@ void *vga_update_vram(VGAState *s, void *vga_ram_base, int vga_ram_size) } /* XXX lock needed? */ + old_pointer = s->vram_alloc; + s->vram_alloc = vga_ram_base; + vga_ram_base = (uint8_t *)((long)(vga_ram_base + 15) & ~15L); memcpy(vga_ram_base, s->vram_ptr, vga_ram_size); - old_pointer = s->vram_ptr; s->vram_ptr = vga_ram_base; return old_pointer; diff --git a/tools/ioemu/hw/vga_int.h b/tools/ioemu/hw/vga_int.h index 47f1574d11..f5a98a8904 100644 --- a/tools/ioemu/hw/vga_int.h +++ b/tools/ioemu/hw/vga_int.h @@ -78,6 +78,7 @@ #define VGA_MAX_HEIGHT 2048 #define VGA_STATE_COMMON \ + uint8_t *vram_alloc; \ uint8_t *vram_ptr; \ uint8_t *vram_shadow; \ unsigned long vram_offset; \ -- 2.30.2